# -*- encoding:utf8 -*-
from datetime import timedelta, datetime,date
from attendance.models import SpecialWorkshift, AttendRecord, StaffInfo
from attendance.convert import date2str, str2date,date2str
from attendance.tool_func import get_or_none


def is_workday(date_):
    """判断是否工作日，

    Args:
    @date_:date object

    Return:
    @tuple[0]:布尔值，表示是否是工作日
    @tuple[1]:字符串，作息时间段

    说明：
    如果返回：(True,'')，则认为是普通的工作日
              (True,'10:00-17:00'),则按照给定的时间段计算迟到
    
    算法：
    首先查看数据库，如有记录，则返回记录，如果没有记录则星期六，星期日默认非工作日

    """
    datestr=date2str(date_)
    sp_day = get_or_none(SpecialWorkshift, date=datestr)
    if sp_day:
        return sp_day.is_workday, sp_day.workshift
    else:
        if date_.weekday() in [0, 1, 2, 3, 4]:  # 星期一到星期五是工作日
            return True, ""
        else:
            return False, ''


def get_max_workday(due):
    """
    @due: '2016-01-16'
    
    """
    now = str2date(due)
    firstday = now.replace(day=1)
    pos = firstday
    days = 0
    while True:
        if pos > now:
            break
        workday, shift = is_workday(pos)
        if workday:
            days += 1
        pos += timedelta(days=1)
    return days


def get_exp_workdays(due, empid):
    """
    @due: '2016-01-16'
    
    """
    now = str2date(due)
    firstday = now.replace(day=1)

    staff = get_or_none(StaffInfo, employee_id=empid)
    if staff:
        startmoki = str2date(staff.on_board_date)
        if startmoki < firstday:
            return get_max_workday(due)
        else:
            return max(0, get_max_workday(due) - (startmoki - firstday).days)
    else:
        return 0
